#include <iostream>
#include <functional>

using namespace std;

int main()
{
    int value = 7;

    /**
     * 1. Lambda 表达式实际上就是函数调用
     * 2. 可以将 lambda 表达式返回值作为函数指针使用
     * 3. 引用捕获可以改变值；值捕获只是使用，不能改变
    */
    // auto func = [](int b) -> int { return ++b; };
    int(*func)(int);
    func = [](int b) -> int { return ++b; };
    cout << func(value) << endl;
    
    auto func2 = [=] { return value; };
    cout << func2() << endl;

    function<int(int)> func3 = func;
    cout << func3(value) << endl;

    /**
     * 1. 当使用函数包装器（function）作为类型时，绑定的函数名称在调用时需要传入全部参数
     * 2. 当使用 auto 作为 bind 返回值时可以不传入全部参数
    */
    auto add = [](int a, int b) -> int { return a + b; };
    function<int(int, int)> func5 = bind(add, placeholders::_1, value);
    // cout << func5(6) << endl;        // Err,需要传入全部参数
    cout << func5(6, value) << endl;
    
    return 0;
}